import os
import time 
import google.generativeai as genai
from flask import Flask, render_template, request
from dotenv import load_dotenv

# ==================== 关键修改：设置网络代理 ====================
# 请务必将 '7890' 修改为您自己VPN客户端实际的HTTP代理端口号
# 常见的端口有 7890, 1080, 10808, 8889 等，请在VPN设置中查找
PROXY_PORT = '7897' 
os.environ['HTTP_PROXY'] = f'http://127.0.0.1:{PROXY_PORT}'
os.environ['HTTPS_PROXY'] = f'http://127.0.0.1:{PROXY_PORT}'
# ================================================================

# --- 配置 ---
# 加载 .env 文件中的环境变量
load_dotenv()

# 设置Flask应用
app = Flask(__name__)

# 从环境变量中获取并配置Google API Key
GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY')
if not GOOGLE_API_KEY:
    raise ValueError("错误：请在 .env 文件中设置您的 GOOGLE_API_KEY")
genai.configure(api_key=GOOGLE_API_KEY)

# --- 从您的yml文件中复刻的Prompt ---
SUBTITLE_PROMPT_TEMPLATE = """
你是一个视频字幕分析专家。你的任务是只处理用户上传的字幕文件。
请遵循以下规则进行分析：
1. 检查字幕文件中是否包含音乐符号（如 ♪ 或 ♫）。
2. 识别连续的、格式像歌词的字幕行，如果其持续时间超过30秒，则标记为唱歌片段。
3. 最后，内容格式如下：
    [第几个文件：
    在此处填写文件名]
    -------------
    [第几个唱歌时间片段（一个大的时间段来表示可能唱的一首歌，至少1分钟以上）：
    打印出该唱歌时间段/ 未发现唱歌迹象]
    [唱歌时间段的五个时间戳的内容：]
"""

BARRAGE_PROMPT_TEMPLATE = """
你是一个视频弹幕分析专家。你的任务是只处理用户上传的弹幕文件。
**分析逻辑与规则：**
1.  **核心原则**：一个真正的唱歌片段，相关的弹幕应该是**密集且连续**出现的。单个、孤立的关键词几乎没有意义。
2.  **寻找关键词集群**：重点关注在**短时间内（例如1-2分钟内）**，以下关键词**反复或扎堆**出现的时间区域：
    *   **强相关词**: 唱歌, 好听, 开口跪, 天籁, 这是什么歌, 求歌名, 点歌, 神曲
    *   **中相关词**: 唱, 歌, BGM, OST, 歌词, 副歌, 前奏, bgm是啥
    *   **弱相关词 (作为辅助判断)**: 绝了, 好会, 牛, 音乐
3.  **上下文判断**：结合弹幕的上下文。例如，“主播唱歌真好听”是强证据，而“主播别唱了”虽然也提到唱歌，但情绪不同。
4.  **总结时间段**：不要只列出零散的时间点。请将密集的弹幕时间点**归纳总结**成一个或多个大致的**时间段**（例如：`00:19:30 ~ 00:23:20`）。
5.  **提供证据**：在每个判定的时间段后，请列出你找到的**核心弹幕关键词**作为判断依据。
6. 最后，内容格式如下：
    [第几个文件：文件的名称]
    -------------
    [第几个密集时间段：
    打印出密集时间段/ 未发现相关弹幕]
    [密集时间段的五个时间戳的内容：]
"""

# --- Flask路由和核心逻辑 ---
@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # ==================== DEBUG LOG 1 ====================
        print(f"[{time.strftime('%H:%M:%S')}] 收到POST请求，开始处理...")
        # =======================================================
        
        subtitle_files = request.files.getlist('subtitle_files')
        barrage_files = request.files.getlist('barrage_files')

        files_to_process = None
        prompt_template = None
        
        if subtitle_files and subtitle_files[0].filename:
            files_to_process = subtitle_files
            prompt_template = SUBTITLE_PROMPT_TEMPLATE
            print(f"[{time.strftime('%H:%M:%S')}] 检测到字幕文件，准备分析...")
        elif barrage_files and barrage_files[0].filename:
            files_to_process = barrage_files
            prompt_template = BARRAGE_PROMPT_TEMPLATE
            print(f"[{time.strftime('%H:%M:%S')}] 检测到弹幕文件，准备分析...")
        else:
            return render_template('index.html', result="错误：请至少上传一种文件。")

        all_content = ""
        for file in files_to_process:
            try:
                # 关键：这里已经将文件内容转换为纯文本
                content = file.stream.read().decode('utf-8')
                # 用简单的Markdown风格格式化
                all_content += f"--- 文件: {file.filename} ---\n\n{content}\n\n"
            except Exception as e:
                all_content += f"--- 文件: {file.filename} 读取失败: {str(e)} ---\n\n"
        
        print(f"[{time.strftime('%H:%M:%S')}] 文件读取并转换为文本完毕，准备调用Gemini API...")
        
        try:
            # 使用最稳定的模型以确保API Key和账户没有问题
            model = genai.GenerativeModel('gemini-2.0-flash') 
            
            # 组合最终的Prompt，这是一个巨大的纯文本字符串
            final_prompt = prompt_template + "\n\n【用户上传的文件内容如下】\n\n" + all_content
            
            # ==================== DEBUG LOG 2 ====================
            print(f"[{time.strftime('%H:%M:%S')}] 正在通过代理向Gemini发送请求，这可能需要一些时间，请耐心等待...")
            # =======================================================
            
            response = model.generate_content(final_prompt)
            
            # ==================== DEBUG LOG 3 ====================
            print(f"[{time.strftime('%H:%M:%S')}] Gemini响应成功！准备返回结果到前端。")
            # =======================================================
            
            return render_template('index.html', result=response.text)
            
        except Exception as e:
            print(f"[{time.strftime('%H:%M:%S')}] API调用失败！错误: {e}")
            return render_template('index.html', result=f"API调用失败，错误信息：\n{str(e)}")

    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)